package org.lzfto.flink.demo.business.flinkTest.test;

import java.util.List;
import java.util.Map;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.table.api.TableConfig;
import org.apache.flink.table.api.TableResult;
import org.lzfto.flink.demo.business.flinkTest.entity.TestInfo;
import org.lzfto.flink.demo.common.result.PubResult;
import org.lzfto.flink.demo.utils.FlinkUtil;

/**
 * Flink测试接口
 * 
 * @author lzfto
 * @created 2025年6月1日 14:37:57
 */
public interface FlinkTestInterface {

	/**
	 * 获取测试序号
	 * 
	 * @return
	 */
	public TestInfo getTestInfo();

	/**
	 * 执行tableapi等操作，并返回相关信息
	 * 
	 * @return
	 * @throws Exception
	 */
	Object run() throws Exception;
	
	/**
	 * 带参数运行
	 * @param param
	 * @return
	 * @throws Exception
	 */
	default Object run(Map<String,Object> param) throws Exception{
		return PubResult.ok("");
	}
	
	/**
	 * 判断是否正在运行
	 * @return
	 */
	default Boolean isRunning() {
		return false;
	}

	/**
	 * 清理bean中已经存在的作业相关对象
	 * @return 表示是否成功得结果。   通过data来判断是否成功，不能通过flag来判断
	 */
	default PubResult<Boolean> clean() {
		return PubResult.ok_data(true);
	}

	/**
	 * 获取一个全局的低级被设置 </br>
	 * 参考：https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/dev/table/config/
	 * 
	 * @return
	 */
	default Configuration createLowLevelTableConfig() {
		Configuration configuration = new Configuration();
		configuration.setString("table.exec.mini-batch.enabled", "true");
		configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
		configuration.setString("table.exec.mini-batch.size", "5000");
		return configuration;
	}

	/**
	 * 获取一个表级别设置
	 * 
	 * @return
	 */
	default TableConfig createTableLevelTableConfig() {
		TableConfig tableConfig = TableConfig.getDefault();
		tableConfig.set("table.exec.mini-batch.enabled", "true");
		tableConfig.set("table.exec.mini-batch.allow-latency", "5 s");
		tableConfig.set("table.exec.mini-batch.size", "5000");
		return tableConfig;
	}

	/**
	 * 创建一个用于执行批处理的配置，用于执行table api的批处理任务。
	 * 
	 * @param parallelQty 并行度,可空，空则表示-1，不显示。其它最小值是1
	 * @return
	 */
	default Configuration createTableBathConfig(Integer parallelQty) {
		// 注意，不是什么选项都可以用于batch
		// 请参阅https://nightlies.apache.org/flink/flink-docs-release-1.20/zh/docs/dev/table/config
		TableConfig tableConfig = TableConfig.getDefault();
		tableConfig.set("table.exec.resource.default-parallelism", parallelQty == null ? "-1" : parallelQty.toString());
		return tableConfig.getConfiguration();
	}

	/**
	 * 打印输出表的结果（最多支持100条，避免网络或者内存爆炸) <br/>
	 * 注意，仅为测试目的，适合少量的，批次的操作
	 * 
	 * @param sinkResult
	 * @return
	 */
	default List<Map<String, Object>> printTableResult(TableResult sinkResult) {
		return FlinkUtil.printTable(sinkResult);
	}
}
